接下來兩篇又回到C++的世界啦!
一樣就是先去撈官方網站的範例程式:
$ roscd beginner_tutorials/src
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/talker/talker.cpp
這樣我們就有一個talker.cpp的程式囉! 裡面的邏輯其實跟之前用python做出來的大同小異:
   1 #include "ros/ros.h"
   2 #include "std_msgs/String.h"
   3 #include <sstream>
   4  
   5 int main(int argc, char **argv)
   6 {
   7   ros::init(argc, argv, "talker");
   8   ros::NodeHandle n;
   9   ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 
  10   ros::Rate loop_rate(10);
  11
  12   int count = 0;
  13   while (ros::ok())
  14   {
  15     std_msgs::String msg;
  16     std::stringstream ss;
  17     ss << "hello world " << count;
  18     msg.data = ss.str();
  19 
  20     ROS_INFO("%s", msg.data.c_str());
  21     chatter_pub.publish(msg);
  22     ros::spinOnce(); 
  23     loop_rate.sleep();
  24     ++count;
  25   }
  26   return 0;
  27 }
其中建立publisher的函式ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);,最主要的就是advertise這個方法,定義長這樣:
template<class M>
ros::Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false);
class M 表示的是訊息格式,可以有很多不同的格式。advertise吃三個參數,第一個參數就是topic的名稱,第二個是訊息佇列的大小,最大可以塞到1000筆,超過的話就會把之前的訊息丟掉,第三個參數latch表示要不要把最後一個訊息留下來傳給下次接收訊息的每個subscriber。
接下來就是編譯了,一樣要去beginner_tutorials的CMakeList.txt裡面新增編譯的程式碼:
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
其實本來官方範例裡面還有一行add_dependencies(talker beginner_tutorials_generate_messages_cpp),是用來新增相依的模組的,但是在ROS Groovy以後的版本就只要一行target_link_libraries(talker ${catkin_LIBRARIES}) 就可以囉!
接著回去重新make一次,就可以執行囉!
$ cd ~/catkin_ws
$ catkin_make
實際執行畫面長這樣:
使用rostopic echo這個指令就可以監聽該topic收到的訊息囉!